home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_gwu / prompt.c < prev    next >
C/C++ Source or Header  |  1996-01-30  |  3KB  |  140 lines

  1. /*
  2.     GWAda Development Environment for 386/486 PCs   
  3.     Copyright (C) 1993, Arthur Vargas Lopes  & Michael Bliss Feldman
  4.                         vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; version 2 of the License.    
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. /*  prompt.c  */
  21.  
  22. #include <externs.h>
  23.  
  24. int AVL_PROMPT(short lno, short col,char *s, short max)
  25. {
  26.     char *msg;
  27.     char *msg2;
  28.     char fmt[20], change = 0;
  29.     short i = 0, j, k, att, co, wait = 0;
  30.     int ch, lim, ch1, ch2;
  31.     long bk;
  32.     struct rccoord old;
  33.     msg = malloc(max+10);
  34.     msg2 = malloc(max+10);
  35.     if (msg == NULL || msg2 == NULL)  {
  36.         AVL_ERROR("Memory fault!");
  37.         exit(1);
  38.         }
  39.     bk = _setbkcolor(avl_pro_bk_color);
  40.     co = _settextcolor(avl_pro_color);
  41.     old = _settextposition(lno,col);
  42.     att = _settextcursor(0x0707);    
  43.     sprintf(fmt,"%c-%ds",'%',max);
  44.     sprintf(msg,fmt,s);
  45.     _settextposition(lno,col);
  46.     _outtext(msg);
  47.     lim = strlen(s);
  48.     for(i = 0; i < max; ++i) msg[i] = '\0';
  49.     i = 0;
  50.     strcpy(msg,s);
  51.     _settextposition(lno,col);
  52.     ch1 = getch();
  53.     if (isprint(ch1)) {
  54.         msg2[0] = msg[0] = '\0';
  55.         lim = 0;
  56.         }
  57.     wait = 1;
  58.     while ( 1 )  {
  59.         _settextposition(lno,col);
  60.         sprintf(msg2,fmt,msg);
  61.         _outtext(msg2);
  62.         _settextposition(lno,i+col);
  63.         if (!wait)  
  64.             ch1 = getch();
  65.         else
  66.             wait = 0;
  67.         if (ch1 == 0) {
  68.             ch2 = getch();
  69.             if (ch2 == 75)  /*  left arrow  */
  70.                 if (i <= 0) putchar(7);
  71.                 else --i;
  72.             else if (ch2 == 77) /*  right arrow  */
  73.                 if (i >= lim) putchar(7);
  74.                 else ++i; 
  75.             else if (ch2 == 71)  /* Home  */
  76.                 i = 0;
  77.             else if (ch2 == 79)  /* End  */
  78.                 i = strlen(msg);
  79.             else if (ch2 == 83) {  /* Del */
  80.                 if (i >= 0 && i < lim)   {
  81.                     --lim;
  82.                     change = 1;
  83.                     for (j = i; j < lim; ++j)
  84.                         msg[j] = msg[j + 1];
  85.                     msg[lim] = '\0';
  86.                     }
  87.                 }
  88.             else putchar(7);
  89.             }
  90.         else if (ch1 == 8) /* Backspace */
  91.                 if (i <= 0) putchar(7);
  92.                 else {
  93.                     --lim;
  94.                     for (j = i - 1; j < lim; ++j)
  95.                         msg[j] = msg[j + 1];
  96.                     msg[lim] = '\0';
  97.                     --i;
  98.                     }
  99.         else if (ch1 == 9)  putchar(7); /* Tab */
  100.         else if (ch1 == '\n' || ch1 == 13) {
  101.             msg[i] = '\0';
  102.             break;
  103.             }
  104.         else if (ch1 == 27)  { msg[0] = '\0'; break; } /* ESC */
  105.         else if (!isprint(ch1)) putchar(7);
  106.         else {
  107.             if (i >= max) {
  108.                 putchar(7);
  109.                 continue;
  110.                 }
  111.             _settextposition(lno,col+i);
  112.             putch(ch1);
  113.             msg[i++] = ch1;
  114.             if (i > lim) 
  115.                 msg[i] = '\0';
  116.             }
  117.         lim = strlen(msg);
  118.         sprintf(msg2,fmt,msg);
  119.         _settextposition(lno,col);
  120.         _outtext(msg2);
  121.         if (ch1 == 27) {
  122.             msg[0] = '\0';
  123.             break;
  124.             }
  125.  
  126.         }
  127.  
  128.     if (strlen(msg) > 0)
  129.         strcpy(s,msg);
  130.     *(s+max) = '\0';
  131.     _setbkcolor(bk);
  132.     _settextcolor(co);
  133.     _settextposition(old.row,old.col);
  134.     _settextcursor(att);    
  135.     free(msg);
  136.     free(msg2);
  137.     if (ch1 == 27 || s[0] == '\0') return 1;
  138.     else return 0;
  139. }
  140.